﻿'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' Codigo de proyecto: 306 F                                     
' Nombre proyecto: Framework Web LNK                            
' Nombre del módulo: Reporte                                    
' Tarea/s relacionada/s: Master Pages                           
' Fecha creacion: 19/11/2009                                    
' Autor/es original/es: Mauro Cristy mcristy@cdt-ar.com         
' Fecha modificacion: No Aplica                                 
' Autor modificacion: No Aplica                                 
' R02 relacionados: 04                                          
' R03 relacionados: No Aplica                                   
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

#Region "Public Delegates"

''' <summary>
''' Delegado manejador del evento AntesDeCargarDatos del ReporteBase.
''' </summary>
''' <remarks>Para utilizar este evento, deberá crearse un método local con la misma firma que el evento en cuestión y configurarlo como manejador del mismo: AddHandler masterpage.AntesDeCargarDatos, AddressOf localPreConsulta</remarks>
''' <param name="cancela">Si se asigna TRUE a esta variable, se cancelará la grabación.</param>
''' <param name="cancel">Asignando TRUE a este parámetro se logrará evitar la ejecución del método estándar de consulta de datos.</param>
Public Delegate Sub ReporteAntesDeCargarDatosHandler(ByRef cancel As Boolean)
''' <summary>
''' Delegado manejador del evento DespuesDeCargarDatos del ReporteBase.
''' </summary>
''' <remarks>Para utilizar este evento, deberá crearse un método local con la misma firma que el evento en cuestión y configurarlo como manejador del mismo: AddHandler masterpage.DespuesDeCargarDatos, AddressOf localPostConsulta</remarks>
''' <param name="cancela">Si se asigna TRUE a esta variable, se cancelará la grabación.</param>
''' <param name="cancel">Asignando TRUE a este parámetro se logrará evitar la ejecución del método estándar de consulta de datos.</param>
Public Delegate Sub ReporteDespuesDeCargarDatosHandler(ByRef cancel As Boolean)

#End Region

Partial Public Class Reporte
    Inherits System.Web.UI.MasterPage

#Region "Propiedades"

    Private _lnk_dataset As DataSet
    ''' <summary>
    ''' Dataset que contiene los datos del reporte a ejecutar.
    ''' </summary>
    Public Property Lnk_dataset() As DataSet
        Get
            Return _lnk_dataset
        End Get
        Set(ByVal value As DataSet)
            _lnk_dataset = value
        End Set
    End Property


    Private _ObjetoReglaNegocios As IAbm
    ''' <summary>
    ''' Objeto de reglas del negocio encargado de la administración del formulario.
    ''' </summary>
    Private Property ObjetoReglaNegocios() As IAbm
        Get
            Return _ObjetoReglaNegocios
        End Get
        Set(ByVal value As IAbm)
            _ObjetoReglaNegocios = value
        End Set
    End Property

    Public _lblTitulo As String
    ''' <summary>
    ''' Label con el título del formulario.
    ''' </summary>
    Public Property lblTitulo() As String
        Get
            Return _lblTitulo
        End Get
        Set(ByVal value As String)
            _lblTitulo = value
        End Set
    End Property

    ''' <summary>
    ''' Expresión SQL-ORDER BY que determina el ordenamiento de los datos a desplegar.
    ''' </summary>
    Public Property SortExpression() As String
        Get
            If ViewState("SortExpression") Is Nothing Then
                Return String.Empty
            Else
                Return ViewState("SortExpression").ToString()
            End If
        End Get
        Set(ByVal Value As String)
            ViewState("SortExpression") = Value
        End Set
    End Property

    Public Property SortDirection() As String
        Get
            If ViewState("SortDirection") Is Nothing Then
                Return String.Empty
            Else
                Return ViewState("SortDirection").ToString()
            End If
        End Get
        Set(ByVal Value As String)
            ViewState("SortDirection") = Value
        End Set
    End Property

#End Region

#Region "Variables Privadas"
    Private tablaFiltrado As New Table
#End Region

#Region "Eventos"

    Private Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        Page.EnableViewState = True

        'Graba Log de acceso
        If Not Page.IsPostBack Then
            Dim parametros As New ArrayList
            parametros.Add(Common.Env.Operador)
            parametros.Add(ObjetoReglaNegocios.getNombrePrograma())
            parametros.Add(DBNull.Value)
            parametros.Add("I")
            parametros.Add(Common.Env.Terminal)
            parametros.Add("Ingreso a la pagina web")
            parametros.Add(DBNull.Value)
            Sql.ExecSP(ConnectionString, "wp_grabar_log", parametros)
        End If

        'Agrego al OnClick del boton de imprimir, la funcionalidad de JavaScript
        cmdImprimir.Attributes.Add("onclick", "ImprimirSeleccion('" & divTabla.ClientID & "')")
    End Sub

    Protected Sub comboReportes_SelectedIndexChanged(ByVal sender As Object, ByVal e As EventArgs) Handles comboReportes.SelectedIndexChanged
        Session("ReporteSeleccionado") = comboReportes.SelectedValue
        tablaFiltrado = tablaFormulario(Session("ReporteSeleccionado"))
        divFormularioFiltro.Controls.Add(tablaFiltrado)
    End Sub

    ''' <summary>
    ''' Evento que se dispara antes de ejecutar la consulta que cargará lnk_dataset con datos para el informe.
    ''' </summary>
    ''' <remarks>Puede utilizarse este evento como una alternativa para llenar el mencionado dataset. En tal caso, deberá asignarse TRUE al parámetro 'cancel' de forma tal de evitar que se ejecute la consulta estándar para llenar dicho dataset.</remarks>
    Public Event AntesDeCargarDatos As ReporteAntesDeCargarDatosHandler
    ''' <summary>
    ''' Evento que se dispara después de ejecutar la consulta que llenó con datos para el informe el dataset lnk_dataset.
    ''' </summary>
    ''' <remarks>
    ''' Puede utilizarse este evento para cancelar en display del informe en base a alguna validación en particular, redirigirlo a otro tipo de salida o bien manipular los datos encontrados.
    ''' Si se asigna TRUE al parámetro 'cancel' se cancelará el display del informe.
    ''' </remarks>
    Public Event DespuesDeCargarDatos As ReporteDespuesDeCargarDatosHandler

    ''' <summary>
    ''' Ejecuta la búsqueda de datos (con los filtros especificados) ante la petición de una presentación preliminar del informe o consulta seleccionada en pantalla.
    ''' </summary>
    Protected Sub Buscando() Handles cmdPreview.Click
        Dim OrigenDatos As String = ""
        Dim Parametros As New ArrayList
        Dim ValorCampo As String = ""
        Dim errorTxt As String = ""
        Dim CancelAntes As Boolean = False
        Dim CancelDespues As Boolean = False

        If comboReportes.SelectedValue = "" Then
            msgTab1.InnerHtml = "No hay reportes seleccionados para buscar"
            Return
        End If


        Session("ReporteSeleccionado") = comboReportes.SelectedValue
        Lnk_dataset = Sql.Select(ConnectionString, "nm_origen_datos", "wad_reportes", _
                                 "nm_reporte = '" & Session("ReporteSeleccionado") & "'")

        OrigenDatos = Lnk_dataset.Tables(0).Rows(0)(0)

        Lnk_dataset = DA.Sql.Select(ConnectionString, "*", "wld_filtros_reporte", _
                                    "nm_reporte = '" & Session("ReporteSeleccionado") & "'", "nu_orden asc")
        Dim tablaCampos As DataTable = Lnk_dataset.Tables(0)

        For Each row In tablaCampos.Rows
            Dim nm_campo As String = row(1)
            'Verificamos si el tipo de campo es 'Desde-Hasta' o 'Simple'
            Lnk_dataset = DA.Sql.Select(ConnectionString, "*", "wld_campos_filtro", _
                                    "nm_campo = '" & nm_campo & "'")
            Dim datos_campo As DataRow = Lnk_dataset.Tables(0).Rows(0)
            If datos_campo(1) = "D" Then
                Select Case datos_campo(2)
                    Case "S", "N", "F"
                        ValorCampo = obtenerValorControl("desde_" & nm_campo)
                        Parametros.Add(ValorCampo)
                        ValorCampo = obtenerValorControl("hasta_" & nm_campo)
                        Parametros.Add(ValorCampo)
                    Case "L"
                        ValorCampo = obtenerValorControl(nm_campo)
                        Parametros.Add(ValorCampo)
                End Select
            Else
                ValorCampo = obtenerValorControl(nm_campo)
                Parametros.Add(ValorCampo)
            End If
            'Validaciones
            Dim cantChar As String = datos_campo("ca_caracteres")
            If ValorCampo.Length > cantChar And datos_campo(2) <> "F" Then
                errorTxt &= "Contenido de campo fuera de la cantidad de caracteres permitidos" & vbCrLf
            End If
            If ValorCampo = "" Then
                errorTxt = "El contenido de los campos no puede ser vacio" & vbCrLf
            End If
        Next

        If errorTxt = "" Then
            RaiseEvent AntesDeCargarDatos(CancelAntes)
            If Not CancelAntes Then
                Lnk_dataset = ObjetoReglaNegocios.Listar(OrigenDatos.ToLower(), Parametros)
            End If
            If Lnk_dataset.Tables.Count = 0 Then
                msgTab2.InnerHtml = "No se han encontrado registros"
            Else
                ViewState.Add("tablaDatosDataSource", Lnk_dataset.Tables(0))
                If Lnk_dataset.Tables(0).Rows.Count = 0 Then
                    msgTab2.InnerHtml = "No se han encontrado registros"
                    Session("busqueda") = "NO"
                Else
                    RaiseEvent DespuesDeCargarDatos(CancelDespues)
                    If Not CancelDespues Then
                        tablaDatos.DataSource = Lnk_dataset
                        tablaDatos.DataBind()
                        Session("busqueda") = "SI"
                    End If
                End If
            End If
            'Foco de las solapas
            TabContainer1.ActiveTab = TabPanel2
        Else
            'MsgBox(errorTxt, MsgBoxStyle.OkOnly, "Error")
            msgTab1.InnerHtml = errorTxt
        End If

    End Sub

    Protected Sub tablaDatos_Sorting(ByVal sender As Object, ByVal e As GridViewSortEventArgs) Handles tablaDatos.Sorting
        Dim dataTable As DataTable = CType(ViewState("tablaDatosDataSource"), DataTable)

        If Not dataTable Is Nothing Then
            Dim dataView As DataView = New DataView(dataTable)
            dataView.Sort = e.SortExpression + " " + GetSortDirection(e.SortExpression)
            If SortDirection = "ASC" Then
                e.SortDirection = WebControls.SortDirection.Ascending
            ElseIf SortDirection = "DESC" Then
                e.SortDirection = WebControls.SortDirection.Descending
            End If
            SortExpression = e.SortExpression
            tablaDatos.DataSource = dataView
            tablaDatos.DataBind()
            ViewState.Add("tablaDatosDataSource", dataView.Table())
        End If
    End Sub

    Protected Sub tablaDatos_PageIndexChanging(ByVal sender As Object, ByVal e As GridViewPageEventArgs) Handles tablaDatos.PageIndexChanging
        Dim dataTable As DataTable = CType(ViewState("tablaDatosDataSource"), DataTable)
        If Not dataTable Is Nothing Then
            Dim dataView As DataView = New DataView(dataTable)
            tablaDatos.DataSource = dataView
            tablaDatos.PageIndex = e.NewPageIndex
            tablaDatos.DataBind()
            ViewState.Add("tablaDatosDataSource", dataView.Table())
        End If
    End Sub

    ''' <summary>
    ''' Exporta los datos de la consulta en pantalla a un formato de libro Excel.
    ''' </summary>
    Protected Sub ExportarExcel() Handles cmdExportExcel.Click
        Dim Response As System.Web.HttpResponse = System.Web.HttpContext.Current.Response

        If Session("busqueda") = "SI" Then
            'Borra la respuesta
            Response.Clear()
            Response.ClearContent()
            Response.ClearHeaders()

            Response.Charset = ""
            Response.ContentType = "application/vnd.excel"
            Response.AddHeader("content-disposition", "attachment;filename=Grilla.xls")
            Dim stringWrite As New System.IO.StringWriter
            Dim htmlWrite As New System.Web.UI.HtmlTextWriter(stringWrite)
            Dim dg As New DataGrid
            'dg.DataSource = Lnk_dataset.Tables(0)
            dg.DataSource = ViewState("tablaDatosDataSource")
            dg.DataBind()
            dg.RenderControl(htmlWrite)
            Response.Write(stringWrite.ToString)
            Response.End()
        Else
            msgTab1.InnerHtml = "No hay registros que exportar"
        End If
    End Sub

    ''' <summary>
    ''' Exporta los datos de la consulta en pantalla a un formato de documento de Word.
    ''' </summary>
    Protected Sub ExportarWord() Handles cmdExportWord.Click
        Dim Response As System.Web.HttpResponse = System.Web.HttpContext.Current.Response

        If Session("busqueda") = "SI" Then
            'Borra la respuesta
            Response.Clear()
            Response.ClearContent()
            Response.ClearHeaders()

            Response.Charset = ""
            Response.ContentType = "application/vnd.word"
            Response.AddHeader("content-disposition", "attachment;filename=Grilla.doc")
            Dim stringWrite As New System.IO.StringWriter
            Dim htmlWrite As New System.Web.UI.HtmlTextWriter(stringWrite)
            Dim dg As New DataGrid
            'dg.DataSource = Lnk_dataset.Tables(0)
            dg.DataSource = ViewState("tablaDatosDataSource")
            dg.DataBind()
            dg.RenderControl(htmlWrite)
            Response.Write(stringWrite.ToString)
            Response.End()
        Else
            msgTab1.InnerHtml = "No hay registros que exportar"
        End If
    End Sub

    ''' <summary>
    ''' Exporta los datos de la consulta en pantalla a un formato XML estándar.
    ''' </summary>
    Protected Sub ExportarXML() Handles cmdExportXML.Click
        Dim Response As System.Web.HttpResponse = System.Web.HttpContext.Current.Response

        If Session("busqueda") = "SI" Then
            'Borra la respuesta
            Response.Clear()
            Response.ClearContent()
            Response.ClearHeaders()

            Response.Charset = ""
            Response.ContentType = "application/vnd.xml"
            Response.AddHeader("content-disposition", "attachment;filename=Grilla.xml")
            Dim stringWrite As New System.IO.StringWriter
            Dim htmlWrite As New System.Web.UI.HtmlTextWriter(stringWrite)
            Dim dataTable As DataTable = CType(ViewState("tablaDatosDataSource"), DataTable)
            dataTable.WriteXml(htmlWrite)
            Response.Write(stringWrite.ToString)
            Response.End()
        Else
            msgTab1.InnerHtml = "No hay registros que exportar"
        End If
    End Sub

#End Region

#Region "Metodos Publicos"
    ''' <summary>
    ''' Evento principal de inicialización del formulario, al cual se le pasa como parámetro una instancia del objeto de reglas del negocio con el cual se lo decide enlazar.
    ''' </summary>
    ''' <remarks>Dicho objeto de reglas del negocio determinará el nivel de seguridad de la página y brindará los métodos para ejecutar la consulta de datos.</remarks>
    Public Sub InicializarPagina(ByVal obr As IAbm)
        Dim NombrePrograma As String

        'Titulo del ABM
        abmTitulo1.InnerText = lblTitulo

        'Objeto de regla de negocios
        ObjetoReglaNegocios = obr
        ObjetoReglaNegocios.setOperadorLogueado(Common.Env.Operador)

        'Obtenemos Dataset
        Lnk_dataset = ObjetoReglaNegocios.getDataSet

        'Nombre de programa
        NombrePrograma = ObjetoReglaNegocios.getNombrePrograma()

        'Funcionalidad de la primera ejecucion
        If Not Page.IsPostBack Then
            Lnk_dataset = DA.Sql.Select(ConnectionString, "*", "wad_reportes", "nm_programa = '" & NombrePrograma & "'")
            If Lnk_dataset.Tables(0).Rows.Count > 0 Then
                For Each row In Lnk_dataset.Tables(0).Rows
                    Dim item As New ListItem
                    item.Value = row(0)
                    item.Text = row(1)
                    comboReportes.Items.Add(item)
                Next
                Session("ReporteSeleccionado") = Lnk_dataset.Tables(0).Rows(0)(0)
            Else
                Dim item As New ListItem
                item.Value = ""
                item.Text = "No hay Reportes"
                comboReportes.Items.Add(item)
                comboReportes.Enabled = False
            End If
            Session("busqueda") = "NO"
        End If
        If Not comboReportes.SelectedValue <> Session("ReporteSeleccionado") Then
            tablaFiltrado = tablaFormulario(Session("ReporteSeleccionado"))
            divFormularioFiltro.Controls.Add(tablaFiltrado)
        End If

    End Sub

#End Region

#Region "Metodos Privados"
    Private Function tablaFormulario(ByVal nm_reporte As String) As Table
        Dim tabla As New Table
        Lnk_dataset = DA.Sql.Select(ConnectionString, "*", "wld_filtros_reporte", _
                                    "nm_reporte = '" & nm_reporte & "'", "nu_orden asc")
        Dim tablaCampos As DataTable = Lnk_dataset.Tables(0)
        For Each row In tablaCampos.Rows
            Dim tr As New TableRow
            Dim nm_campo As String = row(1)

            'Etiqueta del campo
            Dim cLabel As New Label
            cLabel.Text = nm_campo & "&nbsp;:"

            Dim tdE As New TableCell
            tdE.Controls.Add(cLabel)
            tdE.HorizontalAlign = HorizontalAlign.Right
            tr.Controls.Add(tdE)

            'Tipo de dato y campo a completar y validacion
            Dim tdC As New TableCell

            Lnk_dataset = DA.Sql.Select(ConnectionString, "*", "wld_campos_filtro", _
                                    "nm_campo = '" & nm_campo & "'")
            Dim datos_campo As DataRow = Lnk_dataset.Tables(0).Rows(0)
            If datos_campo(1) = "D" Then
                'Caso que sean campos 'Deade Hasta'
                If datos_campo("nm_tabla") IsNot DBNull.Value And datos_campo("nm_campo_tabla_id") IsNot DBNull.Value _
                And datos_campo("nm_campo_tabla_desc") IsNot DBNull.Value Then
                    If datos_campo("nm_tabla") <> "" And datos_campo("nm_campo_tabla_id") <> "" _
                    And datos_campo("nm_campo_tabla_desc") <> "" Then
                        Dim comboFKD As New DropDownList
                        comboFKD = CampoFK(datos_campo("nm_tabla"), datos_campo("nm_campo_tabla_id"), datos_campo("nm_campo_tabla_desc"))
                        comboFKD.ID = "desde_" & nm_campo
                        comboFKD.Attributes.Add("class", "sel")
                        tdC.Controls.Add(comboFKD)
                        Dim comboFKH As New DropDownList
                        comboFKH = CampoFK(datos_campo("nm_tabla"), datos_campo("nm_campo_tabla_id"), datos_campo("nm_campo_tabla_desc"))
                        comboFKH.ID = "hasta_" & nm_campo
                        comboFKH.Attributes.Add("class", "sel")
                        tdC.Controls.Add(comboFKH)
                    End If
                Else
                    Select Case datos_campo(2)
                        Case "S"
                            'Primer control
                            Dim cTxtBoxD As New TextBox
                            cTxtBoxD.ID = "desde_" & nm_campo
                            cTxtBoxD.Attributes.Add("class", "texto1")
                            If datos_campo("va_defecto_min") IsNot DBNull.Value Then
                                If datos_campo("va_defecto_min") <> "" Then
                                    cTxtBoxD.Text = datos_campo("va_defecto_min")
                                End If
                            End If
                            tdC.Controls.Add(cTxtBoxD)
                            'Primer validador de rango
                            If datos_campo("va_minimo") IsNot DBNull.Value And datos_campo("va_maximo") IsNot DBNull.Value Then
                                If datos_campo("va_minimo") <> "" And datos_campo("va_maximo") <> "" Then
                                    Dim ValidadorDesde As New RangeValidator
                                    ValidadorDesde.MinimumValue = datos_campo("va_minimo")
                                    ValidadorDesde.MaximumValue = datos_campo("va_maximo")
                                    ValidadorDesde.Type = ValidationDataType.String
                                    ValidadorDesde.ErrorMessage = "Fuera de rango"
                                    ValidadorDesde.Display = ValidatorDisplay.Dynamic
                                    ValidadorDesde.ControlToValidate = "desde_" & nm_campo
                                    tdC.Controls.Add(ValidadorDesde)
                                End If
                            End If
                            'Segundo control
                            Dim cTxtBoxH As New TextBox
                            cTxtBoxH.ID = "hasta_" & nm_campo
                            cTxtBoxH.Attributes.Add("class", "texto1")
                            If datos_campo("va_defecto_max") IsNot DBNull.Value Then
                                If datos_campo("va_defecto_max") <> "" Then
                                    cTxtBoxH.Text = datos_campo("va_defecto_max")
                                End If
                            End If
                            tdC.Controls.Add(cTxtBoxH)
                            'Segundo validador de rango
                            If datos_campo("va_minimo") IsNot DBNull.Value And datos_campo("va_maximo") IsNot DBNull.Value Then
                                If datos_campo("va_minimo") <> "" And datos_campo("va_maximo") <> "" Then
                                    Dim ValidadorHasta As New RangeValidator
                                    ValidadorHasta.MinimumValue = datos_campo("va_minimo")
                                    ValidadorHasta.MaximumValue = datos_campo("va_maximo")
                                    ValidadorHasta.ErrorMessage = "Fuera de rango"
                                    ValidadorHasta.Display = ValidatorDisplay.Dynamic
                                    ValidadorHasta.ControlToValidate = "hasta_" & nm_campo
                                    tdC.Controls.Add(ValidadorHasta)
                                End If
                            End If
                        Case "N"
                                'Primer control
                                Dim cIntBoxD As New TextBox
                                cIntBoxD.ID = "desde_" & nm_campo
                            cIntBoxD.Attributes.Add("class", "texto1")
                                If datos_campo("va_defecto_min") IsNot DBNull.Value Then
                                    If datos_campo("va_defecto_min") <> "" Then
                                        cIntBoxD.Text = datos_campo("va_defecto_min")
                                    End If
                                End If
                                tdC.Controls.Add(cIntBoxD)
                                'Primer validador de rango
                                If datos_campo("va_minimo") IsNot DBNull.Value And datos_campo("va_maximo") IsNot DBNull.Value Then
                                    If datos_campo("va_minimo") <> "" And datos_campo("va_maximo") <> "" Then
                                        Dim ValidadorDesde As New RangeValidator
                                        ValidadorDesde.MinimumValue = datos_campo("va_minimo")
                                        ValidadorDesde.MaximumValue = datos_campo("va_maximo")
                                        ValidadorDesde.Type = ValidationDataType.Double
                                        ValidadorDesde.ErrorMessage = "Fuera de rango"
                                        ValidadorDesde.Display = ValidatorDisplay.Dynamic
                                        ValidadorDesde.ControlToValidate = "desde_" & nm_campo
                                        tdC.Controls.Add(ValidadorDesde)
                                    End If
                                End If
                                'Segundo control
                                Dim cIntBoxH As New TextBox
                                cIntBoxH.ID = "hasta_" & nm_campo
                            cIntBoxH.Attributes.Add("class", "texto1")
                                If datos_campo("va_defecto_max") <> "" Or datos_campo("va_defecto_max") IsNot DBNull.Value Then
                                    cIntBoxH.Text = datos_campo("va_defecto_max")
                                End If
                                tdC.Controls.Add(cIntBoxH)
                                'Segundo validador de rango
                                If datos_campo("va_minimo") IsNot DBNull.Value And datos_campo("va_maximo") IsNot DBNull.Value Then
                                    If datos_campo("va_minimo") <> "" And datos_campo("va_maximo") <> "" Then
                                        Dim ValidadorHasta As New RangeValidator
                                        ValidadorHasta.MinimumValue = datos_campo("va_minimo")
                                        ValidadorHasta.MaximumValue = datos_campo("va_maximo")
                                        ValidadorHasta.Type = ValidationDataType.Double
                                        ValidadorHasta.ErrorMessage = "Fuera de rango"
                                        ValidadorHasta.Display = ValidatorDisplay.Dynamic
                                        ValidadorHasta.ControlToValidate = "hasta_" & nm_campo
                                        tdC.Controls.Add(ValidadorHasta)
                                    End If
                                End If
                        Case "F"
                                Dim prefixfecha As String = "desde_"
                                For z = 0 To 1
                                    Dim cDateTime As New TextBox
                                    Dim cCalendar As New AjaxControlToolkit.CalendarExtender
                                    Dim cCalendarImage As New Image
                                    Dim espacio As New Literal

                                    cDateTime.ID = prefixfecha & nm_campo
                                cDateTime.Attributes.Add("class", "texto1")
                                    If z = 0 Then
                                        If datos_campo("va_defecto_min") IsNot DBNull.Value Then
                                            If datos_campo("va_defecto_min") <> "" Then
                                                cDateTime.Text = datos_campo("va_defecto_min")
                                            End If
                                        End If
                                    Else
                                        If datos_campo("va_defecto_max") IsNot DBNull.Value Then
                                            If datos_campo("va_defecto_max") <> "" Then
                                                cDateTime.Text = datos_campo("va_defecto_max")
                                            End If
                                        End If
                                    End If
                                    cCalendar.Format = "dd-MM-yyyy"
                                cCalendarImage.ImageUrl = "~/App_img/calendar.gif"
                                    cCalendarImage.ID = "calendarImg" & z
                                    cCalendarImage.Style.Add("cursor", "pointer")
                                    espacio.Text = "&nbsp;"
                                    cCalendar.TargetControlID = prefixfecha & nm_campo
                                    cCalendar.PopupButtonID = cCalendarImage.ID
                                    cCalendar.Enabled = True
                                    tdC.Controls.Add(cDateTime)
                                    tdC.Controls.Add(espacio)
                                    tdC.Controls.Add(cCalendarImage)
                                    tdC.Controls.Add(cCalendar)
                                    prefixfecha = "hasta_"
                                Next
                        Case "L"
                                Dim cSelect As New DropDownList
                                cSelect.ID = nm_campo
                                Dim csItem1 As New ListItem
                                csItem1.Value = "1"
                                csItem1.Text = "Si"
                                Dim csItem0 As New ListItem
                                csItem0.Value = "0"
                                csItem0.Text = "No"
                                cSelect.Items.Add(csItem0)
                                cSelect.Items.Add(csItem1)
                                Dim csItemAll As New ListItem
                                csItemAll.Value = ""
                                csItemAll.Text = "Todos"
                                csItemAll.Selected = True
                                cSelect.Items.Add(csItemAll)
                                cSelect.Attributes.Add("class", "sel")
                                tdC.Controls.Add(cSelect)
                    End Select
                End If
            Else
                'Caso que sean campos simples
                If datos_campo("nm_tabla") IsNot DBNull.Value And datos_campo("nm_campo_tabla_id") IsNot DBNull.Value _
                And datos_campo("nm_campo_tabla_desc") IsNot DBNull.Value Then
                    If datos_campo("nm_tabla") <> "" And datos_campo("nm_campo_tabla_id") <> "" _
                    And datos_campo("nm_campo_tabla_desc") <> "" Then
                        Dim comboFK As New DropDownList
                        comboFK = CampoFK(datos_campo("nm_tabla"), datos_campo("nm_campo_tabla_id"), datos_campo("nm_campo_tabla_desc"))
                        comboFK.ID = nm_campo
                        comboFK.Attributes.Add("class", "sel")
                        tdC.Controls.Add(comboFK)
                    End If
                Else
                    Select Case datos_campo(2)
                        Case "S"
                            Dim cTxtBox As New TextBox
                            cTxtBox.ID = nm_campo
                            cTxtBox.Attributes.Add("class", "texto1")
                            tdC.Controls.Add(cTxtBox)
                        Case "N"
                            Dim cIntBox As New TextBox
                            cIntBox.ID = nm_campo
                            cIntBox.Attributes.Add("class", "texto1")
                            tdC.Controls.Add(cIntBox)
                        Case "F"
                            Dim cDateTime As New TextBox
                            Dim cCalendar As New AjaxControlToolkit.CalendarExtender
                            Dim cCalendarImage As New Image
                            Dim espacio As New Literal

                            cDateTime.ID = nm_campo

                            cDateTime.Attributes.Add("class", "texto1")

                            cCalendar.Format = "dd-MM-yyyy"
                            cCalendarImage.ImageUrl = "~/App_img/calendar.gif"
                            cCalendarImage.ID = "calendarImg"
                            cCalendarImage.Style.Add("cursor", "pointer")
                            espacio.Text = "&nbsp;"

                            cCalendar.TargetControlID = nm_campo

                            cCalendar.PopupButtonID = cCalendarImage.ID
                            cCalendar.Enabled = True
                            tdC.Controls.Add(cDateTime)
                            tdC.Controls.Add(espacio)
                            tdC.Controls.Add(cCalendarImage)
                            tdC.Controls.Add(cCalendar)
                        Case "L"
                            Dim cSelect As New DropDownList
                            cSelect.ID = nm_campo
                            Dim csItem1 As New ListItem
                            csItem1.Value = "1"
                            csItem1.Text = "Si"
                            Dim csItem0 As New ListItem
                            csItem0.Value = "0"
                            csItem0.Text = "No"
                            cSelect.Items.Add(csItem0)
                            cSelect.Items.Add(csItem1)
                            Dim csItemAll As New ListItem
                            csItemAll.Value = ""
                            csItemAll.Text = "Todos"
                            csItemAll.Selected = True
                            cSelect.Items.Add(csItemAll)
                            cSelect.Attributes.Add("class", "sel")
                            tdC.Controls.Add(cSelect)
                    End Select
                End If
            End If
            tdC.HorizontalAlign = HorizontalAlign.Left
            tr.Controls.Add(tdC)
            tabla.Controls.Add(tr)
        Next
        Return tabla
    End Function

    Private Function obtenerValorControl(ByVal controlId As String) As String
        Dim tipoControl As String
        Dim valor As String = Nothing

        If Not divFormularioFiltro.FindControl(controlId) Is Nothing Then
            tipoControl = divFormularioFiltro.FindControl(controlId).GetType.Name()

            Select Case tipoControl
                Case "TextBox"
                    Dim mpControl As TextBox
                    mpControl = CType(divFormularioFiltro. _
                            FindControl(controlId), TextBox)
                    If Not mpControl Is Nothing Then
                        valor = mpControl.Text
                    Else
                        valor = Nothing
                    End If

                Case "DropDownList"
                    Dim mpControl As DropDownList
                    mpControl = CType(divFormularioFiltro. _
                            FindControl(controlId), DropDownList)
                    If Not mpControl Is Nothing Then
                        If Not mpControl.SelectedItem Is Nothing Then
                            valor = mpControl.SelectedItem.Value
                        Else
                            valor = Nothing
                        End If
                    Else
                        valor = Nothing

                    End If
                Case "CheckBox"
                    Dim mpControl As CheckBox
                    mpControl = CType(divFormularioFiltro. _
                            FindControl(controlId), CheckBox)
                    If mpControl.Checked Then
                        valor = "1"
                    Else
                        valor = "0"
                    End If
                Case "RadioButtonList"
                    Dim mpControl As RadioButtonList
                    mpControl = CType(divFormularioFiltro. _
                            FindControl(controlId), RadioButtonList)
                    If Not mpControl Is Nothing Then
                        If Not mpControl.SelectedItem Is Nothing Then
                            valor = mpControl.SelectedItem.Value
                        Else
                            valor = Nothing
                        End If
                    Else
                        valor = Nothing
                    End If
            End Select
        Else
            valor = Nothing
        End If

        Return valor

    End Function

    Private Function GetSortDirection(ByVal sExpression As String) As String
        If sExpression = SortExpression Then
            If SortDirection = "ASC" Then
                SortDirection = "DESC"
            ElseIf SortDirection = "DESC" Then
                SortDirection = "ASC"
            Else
                SortDirection = "ASC"
            End If
            Return SortDirection
        Else
            SortExpression = SortExpression
            SortDirection = "ASC"
            Return SortDirection
        End If
    End Function

    Private Function CampoFK(ByVal nm_tabla As String, ByVal nm_campo As String, ByVal nm_campo_des As String) As DropDownList
        Dim comboFK As New DropDownList

        Lnk_dataset = DA.Sql.Select(ConnectionString, nm_campo & ", " & nm_campo_des, nm_tabla)
        For Each row In Lnk_dataset.Tables(0).Rows
            Dim item As New ListItem
            item.Value = row(0)
            item.Text = row(1)
            comboFK.Items.Add(item)
        Next
        Return comboFK
    End Function

#End Region

End Class